package com.mt.mtbusinessmanagementsystem.mapper;

import com.mt.mtbusinessmanagementsystem.pojo.dto.*;
import com.mt.mtbusinessmanagementsystem.pojo.entity.*;
import com.mt.mtbusinessmanagementsystem.pojo.view.*;
import com.mt.mtbusinessmanagementsystem.utils.product.level.FatherLevel;
import com.mt.mtbusinessmanagementsystem.utils.product.level.FirstLevel;
import org.apache.ibatis.annotations.*;

import java.util.ArrayList;
import java.util.List;


@Mapper
public interface GeneralMapper {
    // 员工登录
    LoginDTO login(Employee employee);

    // 判断部门是否存在
    Integer isExistDept(Dept dept);

    // 插入部门信息
    @Insert("insert into dept(dept_name, employee_id) values (#{deptName},#{employeeId})")
    void insertDept(Dept dept);

    // 获取职位 ID
    @Select("select posts_id from posts where posts_name=#{postName}")
    Integer getPostID(String postName);

    // 查询部门下的员工列表
    ArrayList<Employee> employeeByDept(Integer deptId);

    // 获取部门 ID
    @Select("select dept_id from dept where dept_name=#{notAssignedDept}")
    Integer getDeptID(@Param("notAssignedDept") String notAssignedDept);

    // 更新员工部门 ID
    @Update("update employee set dept_id=#{newDeptId} where dept_id=#{oldDeptId}")
    void updateEmployeeDeteId(@Param("oldDeptId") Integer oldDeptId, @Param("newDeptId") Integer newDeptId);

    // 删除部门信息
    @Delete("delete from dept where dept_id=#{deptId}")
    void delDept(@Param("deptId") Integer deptId);

    // 查询员工信息
    Employee getEmployee(Employee employee);

    // 查询部门信息
    Dept getDept(Dept dept);

    // 查询部门列表信息
    @Select("select temp.dept_id,temp.dept_name,temp.employee_id,temp.count,employee.employee_name " +
            "from (select dept.dept_id, dept.dept_name,dept.employee_id,count(employee.dept_id) as count " +
            "from dept left join employee on dept.dept_id=employee.dept_id group by dept.dept_id) as temp " +
            "left join employee on temp.employee_id=employee.employee_id")
    ArrayList<DeptDTO> deptInfoByList();

    // 插入职位信息
    @Insert("insert into posts(posts_name) values (#{postsName})")
    void insertPost(@Param("postsName") String postsName);

    // 查询公司信息
    Company getCompany(Company company);

    // 添加公司信息
    @Insert("insert into company(company_name, company_people_number) values (#{companyName},#{companyPeopleNumber})")
    void addCompany(CustomerDTO customerDTO);

    // 添加客户信息
    void addCustomer(CustomerDTO customerDTO);

    // 查询客户列表
    ArrayList<CustomerDTO> queryCustomerList(CustomerDTO customerDTO);

    // 查询创建客户的员工信息
    @Select("select distinct customer.create_employee_id,employee_name from customer,employee where customer.create_employee_id=employee.employee_id")
    ArrayList<CustomerDTO> queryCreateInfo();

    // 查询负责客户的员工信息
    @Select("select distinct customer.employee_id,employee_name from customer,employee where customer.employee_id=employee.employee_id")
    ArrayList<CustomerDTO> queryResponsibleInfo();

    // 更新客户信息
    void customerPut(Customer customer);

    // 添加跟进记录
    @Insert("insert into follow(employee_id, customer_id, start_date) values (#{employeeId},#{customerId},#{startDate})")
    void addFollow(Follow follow);

    // 查询跟进记录
    Follow getFollow(Follow follow);

    // 更新跟进记录
    void followPut(Follow follow);

    // 根据客户 ID 查询客户信息
    @Select("select * from customer where id=#{id}")
    CustomerDTO getCustomer(Integer id);

    // 查询客户详细信息
    CustomerDTO customerDetailedInfo(CustomerDTO customerDTO);

    // 查询跟进方式
    FollowMethod getFollowMethod(FollowMethod followMethod);

    // 添加跟进方式
    @Insert("insert into follow_method(follow_method) values (#{followMethod})")
    void addFollowMethod(FollowMethod followMethod);

    // 删除跟进方式
    @Delete("delete from follow_method where follow_methods_id=#{followMethodId}")
    void delFollowMethod(@Param("followMethodId") Integer followMethodId);

    // 更新跟进方式
    @Update("update follow_method set follow_method.follow_method=#{followMethod} where follow_methods_id=#{followMethodsId}")
    Integer updateFollowMethod(FollowMethod followMethod);

    // 查询所有跟进方式
    @Select("select follow_methods_id, follow_method from follow_method")
    ArrayList<FollowMethod> queryFollowMethod();

    // 批量添加文件信息
    void addFile(ArrayList<FileInfo> infoArrayList);

    // 添加跟进进度
    @Insert("insert into progress(follow_id, date, progress_info, file_array_id, follow_methods_id, employee_id) " +
            "values (#{followId},#{date},#{progressInfo},#{fileArrayId},#{followMethodsId},#{employeeId})")
    void addProgress(Progress progress);

    // 查询文件 ID 列表
    ArrayList<FileInfo> queryFileIdList(ArrayList<FileInfo> infoArrayList);

    // 查询跟进进度列表
    ArrayList<ProgressDTO> queryProgressList(CustomerDTO customerDTO);

    // 根据文件名获取文件列表
    ArrayList<FileInfo> getFileArrayList(String[] split);

    // 判断产品分类级别是否存在
    Integer isLevelExist(ProductsClassificationDTO productsClassificationDTO);

    // 获取最大分类级别
    Integer mexLevel(ProductsClassificationDTO test);

    // 查询文件信息
    FileInfo getFileInfo(FileInfo fileInfo);

    // 查询产品分类类型
    ProductsClassificationType getProductsClassificationType(ProductsClassificationType productsClassificationType);

    // 添加产品分类
    void addProductClass(ProductsClassificationDTO result);

    // 获取一级分类列表
    @Select("select distinct first_classification_id,first_classification_name from products_classification")
    ArrayList<FirstLevel> getFirstList();

    // 获取分类级别列表
    ArrayList<FatherLevel> getLevelList(ProductsClassificationDTO productsClassificationDTO);

    // 更新产品分类信息
    void putProductsClassification(ProductsClassification productsClassification);

    // 删除产品分类
    Integer delProductsClassification(ProductsClassification productsClassification);

    // 模糊查询部门信息
    Dept getFuzzyDept(@Param("deptName") String deptName, @Param("employeeId") String employeeId);

    // 查询职位信息
    Posts getPosts(Posts posts);

    // 查询供应商公司信息
    VendorCompany getVendorCompany(VendorCompany vendorCompany);

    // 插入供应商公司信息
    @Insert("insert into vendor_company(vendor_company_chinese_name, vendor_company_english_name) " +
            "values (#{vendorCompanyChineseName},#{vendorCompanyEnglishName})")
    void insertVendorCompany(VendorCompany vendorCompany);

    // 添加产品信息
    void addProduct(ProductsDTO productsDTO);

    // 更新供应商公司信息
    void putVendorCompany(VendorCompany vendorCompany);

    // 更新产品信息
    void putProduct(ProductsDTO productsDTO);

    // 删除产品信息
    Integer delProduct(Products build);

    // 查询产品信息
    ArrayList<ProductsDTO> queryProduct(ProductsDTO productsDTO);

    // 更新产品数量
    Integer updateProductNumber(ProductsDTO productsDTO);

    // 查询商品信息
    Products getProduct(Products products);

    // 添加商品日志信息
    void addProductLog(ProductsLog productsLog);

    // 统计员工数量
    @Select("select count(employee_id) as count from employee")
    DeptDTO countDeptInfo();

    // 添加新订单信息
    void addMtOrder(MTOrderDTO mtOrderDTO);

    // 修改订单信息
    void updateMtOrder(MTOrderDTO mtOrderDTO);

    // 查询订单信息
    MTOrderDTO getMtOrder(MTOrderDTO mtOrderDTO);

    // 查询订单列表
    ArrayList<MTOrderDTO> queryMtOrderList(MTOrderDTO mtOrderDTO);

    // 添加卖家信息
    void addSellerInfo(SellerAndBuyerInfo sellerAndBuyerInfo);

    // 删除卖家信息
    void deleteSellerInfo(Integer sellerInfoId);

    // 查询卖家信息列表
    List<SellerAndBuyerInfo> querySellerInfoList(SellerAndBuyerInfo sellerAndBuyerInfo);

    // 更新卖家信息
    void updateSellerInfo(SellerAndBuyerInfo sellerAndBuyerInfo);

    //获取员工的最大ID,以便生成员工工号
    String getLastEmployeeId();

    // 修改员工信息
    Integer updateEmployeeInfo(EmployeeDTO employeeDTO);

    // 根据员工工号查询员工DTO
    EmployeeDTO getEmployeeDTOById(String employeeId);

    // 添加新员工信息
    void addEmployee(EmployeeDTO employeeDTO);

    // 根据账号查询员工 (新增方法) 此行更改
    EmployeeDTO getEmployeeByAccount(String account);

    // 查询员工列表
    ArrayList<EmployeeDTO> queryEmployeeList(EmployeeDTO employeeDTO);

    // 删除员工信息
    Integer deleteEmployee(String employeeId);

    // 修改员工职位
    void updateEmployeeInfo(Employee employee);

    // 修改部门信息
    int updateDeptInfo(DeptDTO dept);

    // 根据员工姓名查询员工 ID，返回查询到的第一个匹配的员工 ID（若存在多条匹配记录，仅返回第一条）
    @Select("SELECT employee_id FROM employee WHERE employee_name = #{employeeName} LIMIT 1")
    String getEmployeeIdByName(@Param("employeeName") String employeeName);

    // 修改部门负责人信息，根据部门名称修改对应的负责人 ID
    @Update("UPDATE dept SET employee_id = #{employeeId} WHERE dept_name = #{deptName}")
    void updateDeptManager(@Param("deptName") String deptName, @Param("employeeId") String employeeId);

    // 根据部门ID查询部门信息
    @Select("SELECT * FROM dept WHERE dept_id = #{deptId}")
    Dept getDeptById(@Param("deptId") Integer deptId); // 此行更改

    // 更新部门主管职位为普通员工 (posts_id = 3)
    @Update("UPDATE employee SET posts_id = 3 WHERE employee_id = #{employeeId} AND posts_id = 2")
    void updatePostToNormal(@Param("employeeId") String employeeId); // 此行更改

    // 将该部门的所有员工的部门ID修改为未分配 (ID = 9)
    @Update("UPDATE employee SET dept_id = 9 WHERE dept_id = #{deptId}")
    void updateDeptToUnassigned(@Param("deptId") Integer deptId); // 此行更改


}
